import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
import { history } from 'umi';
const isDev: boolean = process.env.NODE_ENV === 'development'

const ins: AxiosInstance = axios.create({
    baseURL: isDev ? 'http://121.89.205.189/admin' : 'http://121.89.205.189/admin',
    timeout: 6000
})

// 请求拦截器
ins.interceptors.request.use(function (config: AxiosRequestConfig): AxiosRequestConfig {
    // 在发送请求之前做些什么
    // 设定加载的进度条  / 统一传递token 信息(从本地获取)
    config.headers ? config.headers['token'] = localStorage.getItem('token') || '' : config.headers = {}
    return config;
}, function (error: any): Promise<never> {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
ins.interceptors.response.use(function (response: AxiosResponse<any>): AxiosResponse<any> {
    if (response.data.code === '10119') {
        history.push('/login')
    }
    return response;
}, function (error: any): Promise<never> {
    // 对响应错误做点什么
    return Promise.reject(error);
});

// http://www.axios-js.com/zh-cn/docs/#axios-config
// 自定义各种数据请求 axios({})
export default function request(config: AxiosRequestConfig): Promise<AxiosResponse<any>> {
    let { url = '', method = 'GET', data = {}, headers = {} } = config
    // url = url || ''
    // method = method || 'get'
    // data = data || {}
    // headers = headers || ''
    // method 转换为大写
    switch (method.toUpperCase()) {
        case 'GET':
            return ins.get(url, { params: data })
        case 'POST':
            // 表单提交  application/x-www-form-url-encoded
            if (headers['content-type'] === 'application/x-www-form-url-encoded') {
                // 转参数 URLSearchParams/第三方库qs
                const p = new URLSearchParams()
                for (let key in data) {
                    p.append(key, data[key])
                }
                return ins.post(url, p, { headers })
            }
            // 文件提交  multipart/form-data
            if (headers['content-type'] === 'multipart/form-data') {
                const p = new FormData()
                for (let key in data) {
                    p.append(key, data[key])
                }
                return ins.post(url, p, { headers })
            }
            // 默认 application/json
            return ins.post(url, data)
        case 'PUT': // 修改数据 --- 所有的数据的更新
            return ins.put(url, data)
        case 'DELETE': // 删除数据
            return ins.delete(url, { data })
        case 'PATCH': // 更新局部资源
            return ins.patch(url, data)
        default:
            return ins(config)
    }
}